package com.tgy.JUC.CallableTest;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

/***
 * @ClassName: Test1
 * @Description: 测试Callable
 * @Auther: 送你一块二向箔
 * @Date: 14:39 2022/3/11
 * @version : V1.0
 */
public class Test1 {
    public static void main(String[] args) {
        //怎么启动Callable
        //1、new Thread(new Runnable()).start();
        //2、new Thread(new FutureTask<>()).start();
        //3、Thread(new FutureTask(Callable)).start();
        MyThread myThread = new MyThread();
        FutureTask<String> futureTask= new FutureTask<>(myThread);
        //只会输出一次
        //这个并不是缓存，是由于JVM第二次再调用FutrueTask对象所持有的线程
        //此时FutrueTask的state此时已非NEW状态（各个状态，这边不做详细解释）
        //则此时会直接结束对应线程，就会导致任务也不执行
        //只是在第一次调用时返回结果保存了，可能这就是老师所说的缓存
        new Thread(futureTask,"name").start();
        new Thread(futureTask,"name").start();
        try {
            //这个get方法会产生阻塞，把他放到最后，或者异步通讯
            String s = futureTask.get();
            System.out.println(s);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    }
}

class MyThread implements Callable<String> {
    @Override
    public String call() throws Exception {
        System.out.println("call");
        return "你好";
    }
}
